package com.pe.pgn.clubpgn.webapp.controller.devolucioncliente;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.domain.ClpmSerieCanje;
import com.pe.pgn.clubpgn.domain.beans.BNAlmacen;
import com.pe.pgn.clubpgn.domain.beans.BNCatalogo;
import com.pe.pgn.clubpgn.domain.beans.BNDocumentoDetalle;
import com.pe.pgn.clubpgn.domain.beans.BNDocumentoMovArticulo;
import com.pe.pgn.clubpgn.domain.beans.BNEstacion;
import com.pe.pgn.clubpgn.service.CanjeService;
import com.pe.pgn.clubpgn.service.CatalogoService;
import com.pe.pgn.clubpgn.service.DevolucionClienteService;
import com.pe.pgn.clubpgn.service.EstacionService;
import com.pe.pgn.clubpgn.webapp.controller.BaseFormController;
import com.pe.pgn.clubpgn.webapp.util.CalendarUtil;

@Controller
@RequestMapping("/devolucioncliente/**")
public class DevolucionClienteController  extends BaseFormController{

	@Autowired DevolucionClienteService devClienteService;
	@Autowired CanjeService canjeService;
	@Autowired EstacionService estacionService;
	@Autowired CatalogoService catalogoService;
	
	private static final String ES_EDITABLE = "esEditable";
	
	@RequestMapping(value = "/devolucionclientelist.html")
    public void listarCanjes(Model model) {

				
		List<ClpmSerieCanje> serieCanje = new ArrayList<ClpmSerieCanje>();
		List<BNEstacion> estaciones = estacionService.obtenerTodoEstaciones();		
		List<BNCatalogo> catalogos 	= catalogoService.obtenerTodoCatalogos(false);		
		
		List<BNDocumentoMovArticulo> devoluciones  = devClienteService.listaDevoluciones();
		model.addAttribute("devoluciones", devoluciones);
		model.addAttribute("estaciones" , estaciones);
		model.addAttribute("catalogos"  , catalogos);
		model.addAttribute("seriecanje" , serieCanje);
		model.addAttribute("date_format", CLPConstantes.DATE_PATTERN);		
    }	
	
	@RequestMapping(value = "/devolucionclientecanjeform.html", method = RequestMethod.GET)
	public @ModelAttribute("canjeform") BNDocumentoMovArticulo verCanjePremio(
		   @RequestParam(value = "id", required = false) Long id,
		   @RequestParam(value = "esDevolucion", required = true) String esDevolucion
		   , Model model) {

		BNDocumentoMovArticulo bnCanje  = new BNDocumentoMovArticulo();
		if (id != null) { 
			bnCanje = canjeService.obtenerCanjePremio(id);
		}
		model.addAttribute("canjeform" , bnCanje);
		model.addAttribute("esDevolucion",esDevolucion);
		return bnCanje;
	}	
	
	@RequestMapping(value = "/devolucionclienteform.html", method = RequestMethod.GET)
	public @ModelAttribute("devolucionclienteform") BNDocumentoMovArticulo verDevolucionCliente(
		   @RequestParam(value = "id", required = false) Long id, Model model) {

		BNDocumentoMovArticulo bnCanje  = new BNDocumentoMovArticulo();
		List<BNAlmacen> listaalmacen	= new ArrayList<BNAlmacen>();
		
		String daFechaDocDevolucion = CalendarUtil.calendarToString
		(CLPConstantes.DATE_PATTERN,Calendar.getInstance());
		
		bnCanje = devClienteService.obtenerDocumento(id);
		bnCanje.setDaFechaDocDevolucion(daFechaDocDevolucion);
		
		List<ClpmSerieCanje> serieCanje = canjeService.obtenerListaSerieCanjePorAlmacenTipoDocumento(
		bnCanje.getCoAlmacen(), CLPConstantes.ST_DOCUMENTO_DEVOLUCION_CLIENTE);
		
		BNDocumentoMovArticulo bnDevolucion = new BNDocumentoMovArticulo();
		bnDevolucion.setCoDocumentoMovCanje(id);
		bnDevolucion.setCoAlmacen(bnCanje.getCoAlmacen());
		bnDevolucion.setCoAlmacenDestino(bnCanje.getCoAlmacenDestino());
		bnDevolucion.setCoAlmacenOrigen(bnCanje.getCoAlmacenOrigen());
		bnDevolucion.setCoArticulo(bnCanje.getCoArticulo());
		bnDevolucion.setCoCatalogoDestino(bnCanje.getCoCatalogoDestino());
		bnDevolucion.setCoCatalogoOrigen(bnCanje.getCoCatalogoOrigen());
		bnDevolucion.setCoCliente(bnCanje.getCoCliente());
		bnDevolucion.setCoCodigoArticulo(bnCanje.getCoCodigoArticulo());
		bnDevolucion.setCoCodigoPremio(bnCanje.getCoCodigoPremio());
		bnDevolucion.setCoDepartamento(bnCanje.getCoDepartamento());
		bnDevolucion.setCoDistrito(bnCanje.getCoDistrito());
		bnDevolucion.setCodTarjeta(bnCanje.getCodTarjeta());
		bnDevolucion.setCoPremio(bnCanje.getCoPremio());
		bnDevolucion.setCoProvincia(bnCanje.getCoProvincia());
		bnDevolucion.setCoUbigeo(bnCanje.getCoUbigeo());
		bnDevolucion.setDaFechaDocumento(bnCanje.getDaFechaDocumento());
		bnDevolucion.setDaFechaDocDevolucion(bnCanje.getDaFechaDocDevolucion());
		bnDevolucion.setDeAlmacen(bnCanje.getDeAlmacen());
		bnDevolucion.setDeAlmacenDestino(bnCanje.getDeAlmacenDestino());
		bnDevolucion.setDeAlmacenOrigen(bnCanje.getDeAlmacenOrigen());
		bnDevolucion.setDeCatalogo(bnCanje.getDeCatalogo());
		bnDevolucion.setDeCliente(bnCanje.getDeCliente());
		bnDevolucion.setDeCodigoPremio(bnCanje.getDeCodigoPremio());
		bnDevolucion.setDeDepartamento(bnCanje.getDeDepartamento());
		bnDevolucion.setDeDireccion(bnCanje.getDeDireccion());
		bnDevolucion.setDeDistrito(bnCanje.getDeDistrito());
		bnDevolucion.setDeDocumento(bnCanje.getDeDocumento());
		bnDevolucion.setDeDptoPisoInt(bnCanje.getDeDptoPisoInt());
		bnDevolucion.setDeEstacion(bnCanje.getDeEstacion());
		bnDevolucion.setDeJrAvCa(bnCanje.getDeJrAvCa());
		bnDevolucion.setDeMzLote(bnCanje.getDeMzLote());
		bnDevolucion.setDeNumero(bnCanje.getDeNumero());
		bnDevolucion.setDeObservacion("");
		bnDevolucion.setDePremio(bnCanje.getDePremio());
		bnDevolucion.setDeProveedor(bnCanje.getDeProveedor());
		bnDevolucion.setDeProvincia(bnCanje.getDeProvincia());
		bnDevolucion.setDePuntosAcumulados(bnCanje.getDePuntosAcumulados());
		bnDevolucion.setDeSecEtapaZona(bnCanje.getDeSecEtapaZona());
		bnDevolucion.setDeUrbIndResUnVec(bnCanje.getDeUrbIndResUnVec());
		bnDevolucion.setDocumentoDetalle(bnCanje.getDocumentoDetalle());
		bnDevolucion.setDocumentoDetalleDevuelto(bnCanje.getDocumentoDetalleDevuelto());		
		bnDevolucion.setNuDocEntregaReserva(bnCanje.getNuDocEntregaReserva());
		bnDevolucion.setNuDocumento("");
		bnDevolucion.setNuSerie("");
		
		bnDevolucion.setNuSerieCanje(bnCanje.getNuSerie());
		bnDevolucion.setNuDocumentoCanje(bnCanje.getNuDocumento());
		
		bnDevolucion.setStAlmacenPrincipal(bnCanje.getStAlmacenPrincipal());
		bnDevolucion.setStDireccion(bnCanje.getStDireccion());
		bnDevolucion.setStDocumentoMovArt(bnCanje.getStDocumentoMovArt());
		bnDevolucion.setStIndicatorTipoDoc(CLPConstantes.ST_DOCUMENTO_DEVOLUCION_CLIENTE);
		bnDevolucion.setStManejaSerie(bnCanje.getStManejaSerie());
		bnDevolucion.setStManejaStockAlmPrincipal(bnCanje.getStManejaStockAlmPrincipal());
		bnDevolucion.setStManejaStockPuntoCanje(bnCanje.getStManejaStockPuntoCanje());
		bnDevolucion.setStNoManejaStock(bnCanje.getStNoManejaStock());
		bnDevolucion.setStOperacion(CLPConstantes.ST_DOCUMENTO_DEVOLUCION_CLIENTE);
		bnDevolucion.setStTipoDocSerie(CLPConstantes.ST_DOCUMENTO_DEVOLUCION_CLIENTE);
		bnDevolucion.setStPuntoCanje(bnCanje.getStPuntoCanje());
		bnDevolucion.setStrDirEntrega(bnCanje.getStrDirEntrega());
		bnDevolucion.setVaCantidad(bnCanje.getVaCantRestante());
		bnDevolucion.setVaPrecioPremio(bnCanje.getVaPrecioPremio());
		bnDevolucion.setVaPrecioTotal(bnCanje.getVaPrecioTotal());
		bnDevolucion.setVaPuntosPremio(bnCanje.getVaPuntosPremio());
		bnDevolucion.setVaPuntosTotales(bnCanje.getVaPuntosTotales());
		bnDevolucion.setId(bnCanje.getId());
		bnDevolucion.setCoDocumentoMovCanje(bnCanje.getCoDocumentoMovCanje());
		

		List<BNDocumentoDetalle> listaDevueltos = devClienteService.obtenerListaDevueltos(id);
		model.addAttribute("seriecanje"   	   , serieCanje);
		model.addAttribute("listaalmacen" 	   , listaalmacen);			
		model.addAttribute("devolucionclienteform", bnDevolucion);
		model.addAttribute("devueltosSinSerie", listaDevueltos.size());
		
		model.addAttribute("devueltosGeneral", listaDevueltos);
		model.addAttribute(ES_EDITABLE, Boolean.TRUE);	
		return bnDevolucion;
	}
	
	@SuppressWarnings("unchecked")
	@RequestMapping(value = "/devolucionclienteform.html", method = RequestMethod.POST)
	public String manager(@ModelAttribute("devolucionclienteform") BNDocumentoMovArticulo bndocumento,
		BindingResult result, SessionStatus status, HttpServletRequest request, Model model) {
		
		List<ClpmSerieCanje> serieCanje = canjeService.obtenerListaSerieCanjePorAlmacenTipoDocumento(
		bndocumento.getCoAlmacen(), CLPConstantes.ST_DOCUMENTO_DEVOLUCION_CLIENTE);
		
		List<BNAlmacen> listaalmacen = canjeService.obtenerListaAlmacen();		
		Map	map = devClienteService.guardarDevolucion(bndocumento);
			
	    if(map.get("msg").equals("success")){
	    			
	    	saveMessage(request, getText("devolucionclienteForm.added", request.getLocale()));
	    	bndocumento = devClienteService.obtenerDocumentoDevuelto(bndocumento.getId());
	    	bndocumento.setDevueltos(Long.valueOf(bndocumento.getDocumentoDetalleDevuelto().size()));
	    			
	    	List<BNDocumentoDetalle> listaDevueltos = devClienteService.obtenerListaDevueltos(bndocumento.getCoDocumentoMovCanje());
	    			
	    	System.out.println("LA LISTA DE DEVUELTOS GENERAL ES:" + listaDevueltos.size());
	    	model.addAttribute("devueltosSinSerie", listaDevueltos.size());	    			
	    	model.addAttribute("devueltosGeneral", listaDevueltos);
	    	model.addAttribute("devolucionclienteform", bndocumento);
		    model.addAttribute("seriecanje"   , serieCanje);
		    model.addAttribute("listaalmacen" , listaalmacen);	
		    model.addAttribute(ES_EDITABLE, Boolean.FALSE);		
			return "redirect:devolucionclientecanjeform.html?id=" + bndocumento.getId() + "&esDevolucion=N&amp;from=list";		
	    		
	    }else{
	    		
	    	String strDetalle = String.valueOf(map.get("detalle"));
		    model.addAttribute("seriecanje"   	   , serieCanje);
		  	model.addAttribute("listaalmacen" 	   , listaalmacen);	
		    		    		
			saveError(request, getText(strDetalle, request.getLocale()));	    		
	    	return "/devolucioncliente/devolucionclienteform";
	    }					
	}
}
